package com.fc.campusapplicationsystem.util;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Properties;

/**
 * @author kyc
 * 2020-06-23
 * 读取配置文件信息
 */
public class ReadConfigUtil {
    /**
     * 为了读了properties文件
     */
    private Properties properties = null;

    /**
     * 输入流，输出流---为了读取txt文件
     */
    private InputStream in = null;
    private BufferedReader br = null;

    /**
     * 处理propertise文件
     *
     * @param fileConfig 文件的明（路径）
     */
    public ReadConfigUtil(String fileConfig) { //构造方法
        //获取输入流
        try {
            /**
             * 首先，调用对象的getClass()方法是获得对象当前的类类型，这部分数据存在方法区中，而后在类类型上调用getClassLoader()方法是得到当前类型的类加载器，在Java中所有的类都是通过加载器加载到虚拟机中的，而且类加载器之间存在父子关系，就是子知道父，父不知道子，这样不同的子加载的类型之间是无法访问的（虽然它们都被放在方法区中），所以在这里通过当前类的加载器来加载资源也就是保证是和类类型同一个加载器加载的。
             * 最后调用了类加载器的getResourceAsStream()方法来加载文件资源
             */

            //http://blog.csdn.net/funi16/article/details/8137708
            //这里要说明一下，如果说这个方法是在静态代码块中写的话，那么this是不能用的，this是代表该类的对象，把this改成Object即可，而相应的属性变量也需要改为静态的
            in = this.getClass().getClassLoader().getResourceAsStream(fileConfig);
            properties = new Properties();
            properties.load(in);
            in.close();
        } catch (Exception e) {
            System.out.println("------读取properties配置文件" + fileConfig + "时，出错:" + e.getMessage().toString());
        }
    }

    /**
     * 读取properties文件，根据key获取key值所对应的value值
     *
     * @param key
     * @return value 值
     */
    public String getValue(String key) {
        String value = null;
        try {
            value = properties.getProperty(key);
        } catch (Exception e) {
            System.out.println("根据properties的key值获取value值时出错:" + e);
        }
        return value;
    }

    /**
     * 读取非properties文件，获取每行的值 例如文本文件
     *
     * @param fileConfig 文件名（文件 路径）
     * @param flag
     */
    public ReadConfigUtil(String fileConfig, boolean flag) {//构造方法的重载，后面的boolean参数无论是true还是false都没关系，就是为了区分配置文件的类型
        try {
            //JAVA里面对于类进行调用配置资源的文件数据，以this.getClass().getResourceAsStream()来读取比较合适
            in = ReadConfigUtil.class.getClassLoader().getResourceAsStream(fileConfig);
            br = new BufferedReader(new InputStreamReader(in));
        } catch (Exception e) {
            System.out.println("读取文本文件" + fileConfig + "时，出错：" + e.getMessage().toString());
        }
    }

    /**
     * 一行一行读取文本文件
     *
     * @return 这个文本文件
     */
    public String getTextLines() {
        StringBuffer sb = new StringBuffer();
        String temp = null;
        try {
            while ((temp = br.readLine()) != null) {
                //这里说明文本文件里面也可以用#注释
                if (temp.trim().length() > 0 && (!temp.trim().startsWith("#"))) {
                    sb.append(temp);
                    sb.append("\n");
                }
            }
        } catch (IOException e) {
            System.out.println("在读取文本文件时出错：" + e.getMessage().toString());
        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }
        return sb.toString();
    }

}
